package annotation;

import org.junit.Test;

import java.lang.annotation.Annotation;

/**
 * Created by 5406160@qq.com on LiBoWen 李博闻.
 *
 * @ClassName : AnnotationTest
 * @Author : 54061
 * @Date: 2022/2/28 18:03
 */
/*
注解的声明方式:
@interface 注解名{}
注解中属性的声明
数据类型 属性名();
注意
1. 若注解中有属性,则属性必须赋值
2. 为注解属性赋值的格式
@注解(属性名=值,属性名=值)
3. 若属性为数据类型,若数组中只有一个元素,则可以不使用{}
4. 注解中的属性可以设置默认值,数据类型 属性名() default 默认值;
5. 若注解中有属性value 当只为value属性赋值 则可以不使用属性名直接赋值
@MyAnnotation1(value = "hello")===@MyAnnotation1("hello)

元注解
@Target : 用于指定被修饰的注解Annotation能用在修饰那些源程序元素 默认注解可以在如何程序元素 值为 : ElementType的枚举值
          METHOD :方法
          TYPE : 类 接口
          FIELD :字段
          CONSTRUCTOR : 构造方法声明
@Retention : 定义该注解保留到那个代码阶段,值为RetentionPolicy 类型 默认只在源码阶段保留
            SOURCE : 只在源码上保留(默认)
            RUNTIME : 在所有的阶段都保留
@Documented : 被修饰的注解将保留在文档工具类中(API)
@Inherited :标注的注解是否能被继承 , 只能发生在类和类的继承中

解析注解需要使用反射技术
Class中解析注解的方法
isAnnotation() 判断Class所对应类型是否为注解类型
getAnnotation() 获取Class所对应类型所表示的所有注解,包括继承父类的
getDeclaredAnnotations() 获取Class所对应类型所标识的所有注解,不包括继承父类的
isAnnotationPresent(Class annotationClass) 判断Class所对应类型是否标识了某个注解
 */
public class AnnotationTest {
    @Test
    public void test01(){
        Class<Student> clazz1 = Student.class;
        System.out.println(clazz1.isAnnotation());

        Class<MyAnnotation2> clazz2 = MyAnnotation2.class;
        System.out.println(clazz2.isAnnotation());

        Annotation[] annotations = clazz1.getAnnotations();
        for (Annotation annotation : annotations){
            System.out.println(annotation);
        }

        System.out.println("=================");
        Annotation[] declaredAnnotations = clazz1.getDeclaredAnnotations();
        for (Annotation annotation : annotations){
            System.out.println(annotation);
        }

        System.out.println("++++++++++++++++++++++++++++++++++++");
        Class<InterfaceB> clazz3 = InterfaceB.class;
        Annotation[] clazz3Annotations = clazz3.getAnnotations();
        for (Annotation clazz3Annotation : clazz3Annotations) {
            System.out.println(clazz3Annotation);
        }
        System.out.println("++++++++++++++++++++++++++++++++++++");
        boolean annotationPresent = clazz1.isAnnotationPresent(MyAnnotation2.class);
        System.out.println(annotationPresent);



    }
}
